.NET MAUI এ Dependency Injection

Mobile App Development - ডট নেট এমআইইউআই (.NET MAUI)
233
233

Dependency Injection (DI) একটি ডিজাইন প্যাটার্ন যা অ্যাপ্লিকেশনগুলিতে Loose Coupling অর্জন করতে সাহায্য করে। এটি আপনাকে কম্পোনেন্টগুলির মধ্যে নির্ভরশীলতাগুলি বাইরের উৎস থেকে ইনজেক্ট করতে দেয়, যার ফলে কোডের রক্ষণাবেক্ষণ এবং পরীক্ষা করা সহজ হয়। .NET MAUI তে DI ব্যবহারের মাধ্যমে, আপনি কম্পোনেন্টগুলির মধ্যে নির্ভরশীলতাগুলি ম্যানেজ করতে পারেন এবং আপনার অ্যাপ্লিকেশনের কাঠামোকে আরও পরিষ্কার এবং নমনীয় করতে পারেন।

1. .NET MAUI এ Dependency Injection কিভাবে কাজ করে?

.NET MAUI অ্যাপ্লিকেশনগুলিতে Dependency Injection (DI) সিস্টেমটি তৈরি করার জন্য .NET Core থেকে আগত IServiceProvider এর উপর নির্ভরশীল। .NET MAUI তে DI সেটআপ করা সহজ এবং এটি কম্পোনেন্ট এবং সার্ভিসগুলির মধ্যে নির্ভরশীলতা প্রদান করতে সাহায্য করে।

2. .NET MAUI তে DI সেটআপ করার প্রক্রিয়া:

.NET MAUI তে DI ব্যবহারের জন্য নিচের পদক্ষেপগুলি অনুসরণ করতে হবে:

2.1 IServiceCollection কনফিগারেশন:

প্রথমত, অ্যাপ্লিকেশনের App.xaml.cs ফাইলে আপনাকে Dependency Injection Container সেটআপ করতে হবে।

App.xaml.cs:

using Microsoft.Extensions.DependencyInjection;

public partial class App : Application
{
    public App()
    {
        InitializeComponent();

        // Dependency Injection Container তৈরি করা
        var services = new ServiceCollection();
        
        // আপনার সার্ভিস রেজিস্টার করুন
        services.AddSingleton<IMyService, MyService>();

        // MainPage সেটআপ করা
        var serviceProvider = services.BuildServiceProvider();
        MainPage = serviceProvider.GetRequiredService<MainPage>();
    }
}

এখানে, আমরা ServiceCollection ব্যবহার করে DI কনটেইনার তৈরি করেছি এবং তারপর AddSingleton পদ্ধতিতে আমাদের IMyService এবং MyService রেজিস্টার করেছি। এর মাধ্যমে আমরা সার্ভিসটি অ্যাপ্লিকেশনের lifecycle এর সাথে একযোগে ব্যবহার করতে পারব।

2.2 Service Interface এবং Implementation তৈরি করা:

DI ব্যবহারের জন্য আপনাকে প্রথমে একটি Service Interface এবং তার সাথে সম্পর্কিত Implementation তৈরি করতে হবে।

IMyService.cs:

public interface IMyService
{
    string GetGreeting();
}

MyService.cs:

public class MyService : IMyService
{
    public string GetGreeting()
    {
        return "Hello from MyService!";
    }
}

এখানে, IMyService একটি ইন্টারফেস যা GetGreeting() মেথড সংজ্ঞায়িত করেছে, এবং MyService ক্লাস এই ইন্টারফেসটি বাস্তবায়ন করেছে।

2.3 Dependency Injection ব্যবহার করা (UI কোডে):

এখন, আপনি DI দ্বারা ইনজেক্ট করা সার্ভিসটি UI বা অন্য কোনো কম্পোনেন্টে ব্যবহার করতে পারেন। উদাহরণস্বরূপ, MainPage.xaml.cs ফাইলে IMyService ইনজেক্ট করা যাবে।

MainPage.xaml.cs:

public partial class MainPage : ContentPage
{
    private readonly IMyService _myService;

    // Constructor Injection
    public MainPage(IMyService myService)
    {
        InitializeComponent();
        _myService = myService;

        // Service থেকে ডেটা গ্রহণ করা
        var greeting = _myService.GetGreeting();
        GreetingLabel.Text = greeting;
    }
}

এখানে, MainPage ক্লাসের কনস্ট্রাক্টরে IMyService ইনজেক্ট করা হয়েছে এবং _myService.GetGreeting() ব্যবহার করে সার্ভিসের মাধ্যমে গ্রীটিং বার্তা আনা হয়েছে।

2.4 XAML ফাইলে ডেটা প্রদর্শন করা:

এখন, আপনি XAML ফাইলে প্রাপ্ত ডেটাটি প্রদর্শন করতে পারেন।

MainPage.xaml:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Class="MyMauiApp.MainPage">

    <StackLayout>
        <Label x:Name="GreetingLabel"
               Text="Loading..."
               HorizontalOptions="Center"
               VerticalOptions="CenterAndExpand" />
    </StackLayout>

</ContentPage>

এখানে, GreetingLabel টেক্সট আউটপুট দেখাবে, যেটি সার্ভিস থেকে প্রাপ্ত গ্রীটিং বার্তা হবে।

2.5 Scoped এবং Transient Service ব্যবহার করা:

  • Singleton: একবার রেজিস্টার করা হলে সার্ভিসটির একক ইনস্ট্যান্স ব্যবহার করা হয়। এটি অ্যাপ্লিকেশন চলাকালীন সময়ে একটি সময়কাল ধরে একীভূত থাকে।
  • Scoped: এটি নির্দিষ্ট একটি স্কোপের মধ্যে, যেমন একাধিক পেজের জন্য একই সার্ভিসের ইনস্ট্যান্স ব্যবহার করতে পারে।
  • Transient: এটি নতুন ইনস্ট্যান্স তৈরি করবে প্রতি বার সার্ভিসটি ডাকার সময়।

Scoped Example:

services.AddScoped<IMyService, MyService>();

Transient Example:

services.AddTransient<IMyService, MyService>();

3. .NET MAUI DI এবং MVVM প্যাটার্ন:

DI সাধারণত MVVM (Model-View-ViewModel) প্যাটার্নের সাথে ব্যবহার করা হয়, যেখানে ViewModel লজিক এবং ডেটা প্রক্রিয়া পরিচালনা করে, এবং View UI এর উপস্থাপনা করে। .NET MAUI তে DI ব্যবহারের মাধ্যমে ViewModel কে View এ ইনজেক্ট করা যায় এবং অ্যাপ্লিকেশনের লজিক উন্নত করা হয়।

MVVM প্যাটার্নের মধ্যে DI ব্যবহার:

MainPageViewModel.cs:

public class MainPageViewModel
{
    private readonly IMyService _myService;

    // Constructor Injection
    public MainPageViewModel(IMyService myService)
    {
        _myService = myService;
    }

    public string Greeting => _myService.GetGreeting();
}

MainPage.xaml.cs:

public MainPage()
{
    InitializeComponent();
    BindingContext = new MainPageViewModel(DependencyService.Get<IMyService>());
}

সারাংশ:

  • Dependency Injection (DI) .NET MAUI তে একটি গুরুত্বপূর্ণ ডিজাইন প্যাটার্ন, যা আপনার অ্যাপ্লিকেশনের কোডকে পরিষ্কার, মডুলার এবং সহজে টেস্টযোগ্য করে তোলে।
  • .NET MAUI তে DI সেটআপ করতে IServiceCollection ব্যবহার করে সার্ভিস রেজিস্টার করা হয় এবং পরে সেই সার্ভিসকে MainPage বা অন্যান্য কম্পোনেন্টে ইনজেক্ট করা হয়।
  • DI প্রক্রিয়া Singleton, Scoped, এবং Transient পরিষেবাগুলির জন্য সমর্থন করে, যা আপনাকে সার্ভিসের জীবনকাল পরিচালনা করতে সহায়তা করে।
Content added By

Dependency Injection কী এবং কেন গুরুত্বপূর্ণ?

147
147

Dependency Injection (DI) হল একটি ডিজাইন প্যাটার্ন যা প্রোগ্রামিংয়ে ব্যবহার করা হয়, যেখানে একটি ক্লাস তার নির্ভরশীলতাগুলো (dependencies) সরাসরি তৈরি না করে, বরং বাইরে থেকে ইনজেক্ট করা হয়। এটি মূলত একটি অবজেক্টকে তার প্রয়োজনীয় অবজেক্ট বা সেবা প্রদান করার একটি পদ্ধতি।

Dependency Injection এর মূল ধারণা:

  • যখন একটি ক্লাস বা অবজেক্ট অন্য একটি অবজেক্টের সেবা বা ফাংশন ব্যবহার করতে চায়, তখন এই সেবাটি সরাসরি তৈরি করার বদলে, অন্য কোনো উপায়ে (বা বাইরের একটি উপাদান) থেকে সেই সেবাটি ইনজেক্ট করা হয়।
  • এর মাধ্যমে, ক্লাসের মধ্যে নির্ভরশীলতা (dependencies) সরাসরি তৈরি না হয়ে, বাইরে থেকে প্রদান করা হয়।

DI এর মূল উপাদান:

  1. Service (বা Dependency): এই সেবা বা অবজেক্টটি যেটি একটি ক্লাস বা অবজেক্ট ব্যবহার করবে।
  2. Client (বা Consumer): এটি সেই ক্লাস বা অবজেক্ট, যা সেবা বা নির্ভরশীলতা গ্রহণ করবে।
  3. Injector (বা DI Container): এটি সেই উপাদান যা ক্লাস বা অবজেক্টগুলোর নির্ভরশীলতাগুলো ইনজেক্ট করবে।

DI এর ধরণ:

  1. Constructor Injection:

    • ক্লাসের কনস্ট্রাক্টরের মাধ্যমে নির্ভরশীলতাগুলো ইনজেক্ট করা হয়। এটি সাধারণত সবচেয়ে বেশি ব্যবহৃত পদ্ধতি।
    public class ServiceConsumer
    {
        private readonly IService _service;
        
        public ServiceConsumer(IService service)
        {
            _service = service;
        }
        
        public void PerformAction()
        {
            _service.Execute();
        }
    }
    
  2. Property Injection:

    • ক্লাসের প্রপার্টির মাধ্যমে নির্ভরশীলতাগুলো ইনজেক্ট করা হয়। এটি কম ব্যবহৃত পদ্ধতি, তবে বিশেষ কিছু ক্ষেত্রে কার্যকর হতে পারে।
    public class ServiceConsumer
    {
        public IService Service { get; set; }
        
        public void PerformAction()
        {
            Service.Execute();
        }
    }
    
  3. Method Injection:

    • নির্ভরশীলতাগুলো মেথডের মাধ্যমে ইনজেক্ট করা হয়, সাধারণত যখন ক্লাসের অন্যান্য মেথডগুলোর নির্দিষ্টভাবে নির্ভরশীলতা প্রয়োজন।
    public class ServiceConsumer
    {
        public void PerformAction(IService service)
        {
            service.Execute();
        }
    }
    

Dependency Injection কেন গুরুত্বপূর্ণ?

  1. কম্পোনেন্টগুলোর মধ্যে দৃঢ়ভাবে সংযুক্তি (Tight Coupling) কমানো:
    • DI এর মাধ্যমে ক্লাসগুলোর মধ্যে শক্ত সংযুক্তি (tight coupling) কমানো যায়। এক ক্লাস অন্য ক্লাসের ওপর নির্ভরশীল থাকলেও, DI এর মাধ্যমে এটি ক্লাসগুলোর মধ্যে স্বাধীনতা বজায় রাখতে সাহায্য করে। এর ফলে, একটি ক্লাস বা সেবা পরিবর্তন করার সময় অন্যান্য ক্লাসের ওপর প্রভাব পড়ে না।
  2. টেস্টেবিলিটি (Testability):
    • DI দিয়ে একেকটি ক্লাস বা অবজেক্টের নির্ভরশীলতাগুলো সহজেই মক (mock) বা স্টাব (stub) করা যায়, ফলে ইউনিট টেস্টিং সহজ হয়। আপনি সহজেই বিভিন্ন নির্ভরশীলতা ইনজেক্ট করে সেগুলোর আচরণ পরীক্ষা করতে পারেন।
  3. কোড রিয়ুজেবিলিটি (Code Reusability):
    • DI ব্যবহারে আপনি কোডের বিভিন্ন অংশ পুনরায় ব্যবহার করতে পারেন। কারণ, একটি ক্লাস নির্ভরশীলতাগুলি বাইরের সেবা থেকে গ্রহণ করে, তাই সেগুলোর পরিবর্তন বা সেবা যোগ করার সময় কোড পুনঃব্যবহার করা সহজ হয়।
  4. লস স্তরের স্থিতিশীলতা (Loosely Coupled Architecture):
    • DI ব্যবহারের মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনকে একটি loosely coupled আর্কিটেকচার তৈরি করতে পারেন। এটি ভবিষ্যতে নতুন ফিচার যোগ করা এবং পুরনো কোড পরিবর্তন করা সহজ করে তোলে।
  5. অবজেক্ট নির্মাণের জন্য একক জায়গা (Centralized Object Creation):
    • DI কন্টেইনার ব্যবহারের মাধ্যমে, আপনি এক জায়গায় আপনার সমস্ত অবজেক্ট নির্মাণ করতে পারেন, যার ফলে একটি একক পদ্ধতির মাধ্যমে সেবাগুলোর কনফিগারেশন ও ম্যানেজমেন্ট সহজ হয়।
  6. সার্ভিস লাইফটাইম (Service Lifetime) ম্যানেজমেন্ট:
    • DI কন্টেইনার সার্ভিস লাইফটাইম (Transient, Singleton, Scoped) নিয়ন্ত্রণ করতে সক্ষম, যা আপনার অ্যাপ্লিকেশনের পারফরম্যান্স এবং মেমরি ব্যবস্থাপনা উন্নত করতে সাহায্য করে।

DI এর মাধ্যমে প্রাপ্ত সুবিধা:

  • ইনজেক্ট করা সেবা / অবজেক্টের পরিবর্তন করতে সহজ: সার্ভিসটি প্রয়োজনে পরিবর্তন করা সহজ, কারণ ক্লাসটির মধ্যে ইনস্ট্যান্স ক্রিয়েশন লজিক থাকেনা।
  • কোডের রক্ষণাবেক্ষণ সহজ: একবার ইনজেকশন ব্যবহৃত হলে, পরবর্তী সময়ে সহজেই পরিবর্তন বা ফিচার যোগ করা সম্ভব হয়, কারণ ক্লাসগুলি একে অপরের উপর নির্ভরশীল না হয়ে নির্দিষ্ট সেবা থেকে প্রয়োজনীয় তথ্য গ্রহণ করে।

Dependency Injection এর উদাহরণ:

// IService Interface
public interface IService
{
    void Execute();
}

// Service Implementation
public class MyService : IService
{
    public void Execute()
    {
        Console.WriteLine("Service Executed");
    }
}

// Consumer Class
public class ServiceConsumer
{
    private readonly IService _service;

    // Constructor Injection
    public ServiceConsumer(IService service)
    {
        _service = service;
    }

    public void PerformAction()
    {
        _service.Execute();
    }
}

// DI Container Setup (In .NET MAUI or ASP.NET Core)
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient<IService, MyService>(); // Register service
        services.AddTransient<ServiceConsumer>(); // Register consumer
    }
}

এখানে ServiceConsumer ক্লাসের কনস্ট্রাক্টরের মাধ্যমে IService ইনজেক্ট করা হয়েছে, এবং MyService সেবা ব্যবহার করা হচ্ছে।


সারাংশ:

Dependency Injection (DI) একটি শক্তিশালী ডিজাইন প্যাটার্ন যা কোডের রক্ষণাবেক্ষণ, টেস্টিং এবং সম্প্রসারণকে সহজ করে তোলে। এটি ক্লাসের মধ্যে নির্ভরশীলতা ইনজেক্ট করে, যাতে কোডের মধ্যে দৃঢ় সংযুক্তি কমে এবং কোড আরও নমনীয়, পুনঃব্যবহারযোগ্য এবং টেস্টযোগ্য হয়। .NET এবং অন্যান্য আধুনিক ফ্রেমওয়ার্কগুলিতে DI ব্যবহৃত হয় যাতে অ্যাপ্লিকেশনগুলো আরও স্থিতিশীল, দক্ষ এবং সহজে বজায় রাখা যায়।

Content added By

.NET MAUI এ Built-in Dependency Injection ব্যবহার

180
180

Dependency Injection (DI) হল একটি ডিজাইন প্যাটার্ন যা অ্যাপ্লিকেশনের কম্পোনেন্টগুলির মধ্যে ডিপেনডেন্সি বা নির্ভরতা পরিচালনার জন্য ব্যবহৃত হয়। .NET MAUI এ Built-in Dependency Injection ব্যবহার করে অ্যাপ্লিকেশনগুলির মধ্যে সার্ভিস এবং ডিপেনডেন্সি খুব সহজে ইনজেক্ট করা যায়।

.NET MAUI এ DI ব্যবহারের মাধ্যমে আপনি অ্যাপ্লিকেশনের বিভিন্ন সার্ভিস এবং ডিপেনডেন্সি গুলি নিবন্ধিত (register) করতে পারেন এবং সেগুলি ক্লাসে ইনজেক্ট (inject) করতে পারেন, যাতে অ্যাপ্লিকেশন কোড পরিষ্কার, ম্যানেজেবল এবং টেস্টেবল হয়।

DI এর উপকারিতা:

  1. কম্পোনেন্টগুলির মধ্যে সম্পর্ক সহজভাবে প্রতিষ্ঠিত হয়।
  2. অ্যাপ্লিকেশন কোড আরও মডুলার এবং পরীক্ষাযোগ্য (testable) হয়।
  3. সার্ভিসের লাইফটাইম এবং স্কোপ পরিচালনা করা সহজ হয়।

.NET MAUI তে Built-in Dependency Injection ব্যবহার করার পদক্ষেপ:


১. ডিপেনডেন্সি ইনজেকশন কনফিগারেশন

প্রথমে, App.xaml.cs বা App.cs ফাইলে ডিপেনডেন্সি ইনজেকশন কনফিগার করতে হবে। এখানে, ConfigureServices মেথড ব্যবহার করে অ্যাপ্লিকেশনের জন্য সার্ভিস রেজিস্ট্রেশন করা হয়।

App.xaml.cs:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Maui.Controls;
using Microsoft.Maui.Essentials;
using MauiApp1.Services;

namespace MauiApp1
{
    public partial class App : Application
    {
        public App(IServiceProvider serviceProvider)
        {
            InitializeComponent();

            // Initialize main page with DI
            MainPage = serviceProvider.GetRequiredService<MainPage>();
        }

        // Register services and dependency injection
        protected override void OnStart()
        {
            var services = new ServiceCollection();

            // Register services for DI
            services.AddSingleton<MainPage>();
            services.AddSingleton<IDataService, DataService>();

            // Build the service provider
            var serviceProvider = services.BuildServiceProvider();

            // Set the AppShell as the main page
            MainPage = serviceProvider.GetRequiredService<MainPage>();
        }
    }
}

এখানে:

  • ServiceCollection ব্যবহৃত হয়েছে সার্ভিস রেজিস্ট্রেশন করার জন্য।
  • AddSingleton ব্যবহার করা হয়েছে MainPage এবং IDataService সার্ভিস রেজিস্টার করার জন্য, যাতে একক ইনস্ট্যান্সের মাধ্যমে সার্ভিসটি অ্যাপ্লিকেশনে ব্যবহার করা যায়।
  • BuildServiceProvider ব্যবহার করে সার্ভিস প্রোভাইডার তৈরি করা হয়েছে।

২. সার্ভিস তৈরি করা

এখন, আপনি যে সার্ভিসটি ইনজেক্ট করতে চান তা তৈরি করতে হবে। নিচে একটি উদাহরণ হিসেবে IDataService এবং তার DataService ইমপ্লিমেন্টেশন দেওয়া হল।

IDataService Interface:

public interface IDataService
{
    string GetData();
}

DataService Class:

public class DataService : IDataService
{
    public string GetData()
    {
        return "Hello from the Data Service!";
    }
}

এখানে:

  • IDataService একটি ইন্টারফেস যেটি ডেটা প্রদান করার জন্য একটি GetData মেথড সংজ্ঞায়িত করে।
  • DataService এ ইন্টারফেসটির বাস্তবায়ন (implementation) দেওয়া হয়েছে, যেখানে ডেটা ফেরত দেয়।

৩. Dependency Injection ব্যবহার করা

এখন, আপনার MainPage.xaml.cs বা যেকোনো পেজে আপনি IDataService সার্ভিসটি ইনজেক্ট করতে পারবেন।

MainPage.xaml.cs:

using MauiApp1.Services;

namespace MauiApp1
{
    public partial class MainPage : ContentPage
    {
        private readonly IDataService _dataService;

        public MainPage(IDataService dataService)
        {
            InitializeComponent();
            _dataService = dataService;

            // Use the injected service to get data
            DataLabel.Text = _dataService.GetData();
        }
    }
}

এখানে:

  • IDataService ইনজেক্ট করা হয়েছে কনস্ট্রাকটরের মাধ্যমে।
  • _dataService.GetData() ব্যবহার করে সার্ভিসের ডেটা আনা হয়েছে এবং DataLabel এ সেট করা হয়েছে।

৪. MainPage.xaml ফাইলের তৈরি করা

এখন, MainPage.xaml ফাইলে একটি লেবেল তৈরি করা হয়েছে যেখানে ডেটা প্রদর্শিত হবে।

MainPage.xaml:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Class="MauiApp1.MainPage">

    <StackLayout Padding="20">
        <Label x:Name="DataLabel" FontSize="24" />
    </StackLayout>
</ContentPage>

এখানে:

  • DataLabel হল একটি Label যেখানে সার্ভিস থেকে পাওয়া ডেটা দেখানো হবে।

৫. App.xaml.cs (Complete Example)

এখন, সবকিছু একসাথে সাজানো হল।

App.xaml.cs:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Maui.Controls;
using MauiApp1.Services;

namespace MauiApp1
{
    public partial class App : Application
    {
        public App(IServiceProvider serviceProvider)
        {
            InitializeComponent();

            // Initialize main page with DI
            MainPage = serviceProvider.GetRequiredService<MainPage>();
        }

        // Register services and dependency injection
        protected override void OnStart()
        {
            var services = new ServiceCollection();

            // Register services for DI
            services.AddSingleton<MainPage>();
            services.AddSingleton<IDataService, DataService>();

            // Build the service provider
            var serviceProvider = services.BuildServiceProvider();

            // Set the AppShell as the main page
            MainPage = serviceProvider.GetRequiredService<MainPage>();
        }
    }
}

এখানে:

  • MainPage এবং IDataService ইনজেক্ট করা হয়েছে।
  • OnStart() মেথডে ডিপেনডেন্সি রেজিস্টার করা হয়েছে এবং সার্ভিস প্রোভাইডার তৈরি করা হয়েছে।

সারাংশ:

  • Dependency Injection (DI) এর মাধ্যমে .NET MAUI অ্যাপ্লিকেশনের মধ্যে সার্ভিস এবং ডিপেনডেন্সি খুব সহজে ইনজেক্ট করা যায়।
  • ServiceCollection ব্যবহার করে সার্ভিস রেজিস্টার করা হয় এবং তারপর ServiceProvider থেকে সার্ভিস ইনজেক্ট করা হয়।
  • AddSingleton ব্যবহৃত হয় যাতে সার্ভিসের একক (singleton) ইনস্ট্যান্স অ্যাপ্লিকেশন জুড়ে শেয়ার করা হয়।
Content added By

Services এবং Repositories তৈরি

126
126

Services এবং Repositories হল .NET MAUI বা অন্য কোন .NET অ্যাপ্লিকেশনে ডেটা অ্যাক্সেস এবং লজিক ব্যবস্থাপনা করতে ব্যবহৃত সাধারণ ডিজাইন প্যাটার্ন। তারা অ্যাপ্লিকেশনের কোডকে আরও পরিষ্কার এবং টেস্টযোগ্য করতে সাহায্য করে, যাতে বিজনেস লজিক এবং ডেটা অ্যাক্সেস আলাদা রাখা যায়।

Services

Service একটি ক্লাস যা অ্যাপ্লিকেশনের বিজনেস লজিক ধারণ করে। এটি সাধারণত ডেটা প্রসেসিং, ব্যবহারকারী যাচাই, বা অন্য কোন বিজনেস প্রক্রিয়া সম্পাদন করতে ব্যবহৃত হয়। Services সাধারণত অ্যাপ্লিকেশনের একাধিক জায়গায় ব্যবহৃত হয় এবং কন্ট্রোলারের সাথে ইন্টারঅ্যাক্ট করে।

Service তৈরি করার উদাহরণ

  1. ICustomerService Interface:
public interface ICustomerService
{
    Task<List<Customer>> GetCustomersAsync();
    Task<Customer> GetCustomerByIdAsync(int id);
}
  1. CustomerService Implementation:
public class CustomerService : ICustomerService
{
    private readonly ICustomerRepository _customerRepository;

    // Dependency Injection of Repository
    public CustomerService(ICustomerRepository customerRepository)
    {
        _customerRepository = customerRepository;
    }

    // Get all customers
    public async Task<List<Customer>> GetCustomersAsync()
    {
        return await _customerRepository.GetAllCustomersAsync();
    }

    // Get customer by id
    public async Task<Customer> GetCustomerByIdAsync(int id)
    {
        return await _customerRepository.GetCustomerByIdAsync(id);
    }
}

এখানে:

  • ICustomerService একটি ইন্টারফেস যা CustomerService ক্লাসের জন্য বিজনেস লজিক সেবা সরবরাহ করে।
  • CustomerService ক্লাসের মধ্যে ডেটা অ্যাক্সেসের জন্য ICustomerRepository নামের একটি Repository ব্যবহার করা হচ্ছে।

Repositories

Repository হল একটি ক্লাস বা ইন্টারফেস যা ডেটাবেস বা অন্যান্য ডেটা সোর্সের সাথে যোগাযোগ করে এবং ডেটা অ্যাক্সেস অপারেশনগুলি সম্পাদন করে। এটি ডেটা অ্যাক্সেস লজিককে পরিষ্কার এবং পুনঃব্যবহারযোগ্য রাখতে সাহায্য করে।

Repository তৈরি করার উদাহরণ

  1. ICustomerRepository Interface:
public interface ICustomerRepository
{
    Task<List<Customer>> GetAllCustomersAsync();
    Task<Customer> GetCustomerByIdAsync(int id);
}
  1. CustomerRepository Implementation:
public class CustomerRepository : ICustomerRepository
{
    private readonly DbContext _context;

    // Constructor injection for DbContext
    public CustomerRepository(DbContext context)
    {
        _context = context;
    }

    // Get all customers
    public async Task<List<Customer>> GetAllCustomersAsync()
    {
        return await _context.Customers.ToListAsync();
    }

    // Get customer by id
    public async Task<Customer> GetCustomerByIdAsync(int id)
    {
        return await _context.Customers.FindAsync(id);
    }
}

এখানে:

  • ICustomerRepository একটি ইন্টারফেস যা ডেটা অ্যাক্সেসের জন্য প্রয়োজনীয় মেথডগুলো ডিফাইন করে।
  • CustomerRepository ক্লাস ডেটাবেস থেকে ডেটা আনার জন্য DbContext ব্যবহার করে। এটি অ্যাসিঙ্ক্রোনাস অপারেশনগুলো সম্পাদন করে।

Dependency Injection (DI) Setup

.NET MAUI অ্যাপ্লিকেশনে Dependency Injection (DI) ব্যবহার করে Services এবং Repositories সরবরাহ করা হয়। .NET MAUI তে DI কনফিগার করা সহজ এবং এটি অ্যাপ্লিকেশনের বিভিন্ন অংশে পরিষ্কারভাবে ডিপেনডেন্সি ইনজেকশন করতে সাহায্য করে।

  1. App.xaml.cs তে DI কনফিগারেশন:
public partial class App : Application
{
    public App()
    {
        InitializeComponent();

        // Registering services and repositories
        DependencyService.Register<ICustomerService, CustomerService>();
        DependencyService.Register<ICustomerRepository, CustomerRepository>();

        MainPage = new MainPage();
    }
}

এখানে:

  • DependencyService.Register ব্যবহার করে সিস্টেমে CustomerService এবং CustomerRepository ক্লাসগুলো রেজিস্টার করা হয়েছে, যাতে এটি অ্যাপ্লিকেশনের যেকোনো স্থানে সহজে ইনজেক্ট করা যায়।

ব্যবহার করা:

MainPage.xaml.cs এর মধ্যে CustomerService ইনজেক্ট করে ব্যবহার করা:

public partial class MainPage : ContentPage
{
    private readonly ICustomerService _customerService;

    public MainPage(ICustomerService customerService)
    {
        InitializeComponent();
        _customerService = customerService;
    }

    protected override async void OnAppearing()
    {
        base.OnAppearing();

        // Get all customers
        var customers = await _customerService.GetCustomersAsync();
        // Use customers data here
    }
}

এখানে:

  • ICustomerService ইনজেক্ট করে CustomerService ব্যবহার করা হয়েছে। OnAppearing মেথডে GetCustomersAsync মেথড কল করা হয়েছে।

সারাংশ:

  • Service এবং Repository প্যাটার্নগুলি .NET MAUI অ্যাপ্লিকেশনে বিজনেস লজিক এবং ডেটা অ্যাক্সেস লজিকের মধ্যে পরিষ্কার বিভাজন তৈরি করতে সাহায্য করে। এটি কোডের পুনঃব্যবহারযোগ্যতা এবং টেস্টেবিলিটি উন্নত করতে সহায়তা করে।
  • Service ক্লাসটি বিজনেস লজিক পরিচালনা করে, আর Repository ক্লাসটি ডেটাবেস বা অন্য কোনো ডেটা সোর্সের সাথে যোগাযোগ করে।
  • Dependency Injection ব্যবহার করে সহজেই সেবা এবং রিপোজিটরি ক্লাসগুলোকে ইনজেক্ট করা যায়, যা ডেভেলপারদের কোড লিখতে আরও পরিষ্কার এবং সহজ করে তোলে।
Content added By

ViewModelLocator ব্যবহার করে Dependency Injection করা

152
152

Dependency Injection (DI) একটি ডিজাইন প্যাটার্ন যা অবজেক্টের নির্ভরশীলতা বাইরের উৎস থেকে ইনজেক্ট করার মাধ্যমে কোডের মডুলারিটি এবং টেস্টেবিলিটি বৃদ্ধি করে। ViewModelLocator একটি সাধারণ কৌশল যা MVVM (Model-View-ViewModel) ডিজাইন প্যাটার্নে ডিপেন্ডেন্সি ইনজেকশন পরিচালনা করতে ব্যবহৃত হয়। .NET MAUI এ DI কার্যকর করার জন্য ViewModelLocator খুবই সহায়ক, কারণ এটি আপনাকে ViewModel গুলোর জন্য ডিপেন্ডেন্সি সহজভাবে ইনজেক্ট করতে সহায়তা করে এবং ViewModel গুলি কমপ্লেক্সলি ম্যানেজ করার সুযোগ দেয়।


ViewModelLocator ব্যবহার করার সুবিধা:

  1. Centralized Dependency Management: সমস্ত ডিপেন্ডেন্সি এক জায়গায় সেন্ট্রালাইজ করা যায়।
  2. Testability: ViewModel গুলোর জন্য এক্সপ্লিসিটভাবে ডিপেন্ডেন্সি ইনজেক্ট করার মাধ্যমে টেস্টিং সহজ হয়ে যায়।
  3. Cleaner Code: DI-এর মাধ্যমে ViewModel এর অভ্যন্তরীণ ডিপেন্ডেন্সি ম্যানেজ করা সহজ হয় এবং কোড আরও পরিষ্কার থাকে।

ViewModelLocator কিভাবে কাজ করে:

  1. ViewModelLocator মূলত একটি ক্লাস যা আপনার ViewModel গুলোর জন্য ডিপেন্ডেন্সি ইনজেক্ট করার কাজ করে। এটি IOC (Inversion of Control) Container বা DI কন্টেইনারের সাথে কাজ করে, যেখানে আপনি প্রয়োজনীয় সার্ভিস বা ডিপেন্ডেন্সি ইনজেক্ট করেন।
  2. এটি সাধারণত App.xaml.cs ফাইলে ইনস্ট্যান্স তৈরি করা হয় এবং অ্যাপের সেলফ (Self) কনফিগারেশন পরিচালনা করে।

ViewModelLocator উদাহরণ:

আমরা একটি সাধারণ উদাহরণ তৈরি করবো যেখানে আমরা MainPageViewModel এবং ApiService ক্লাসের মধ্যে ডিপেন্ডেন্সি ইনজেকশন ব্যবহার করব।


Step 1: Define the Dependencies

প্রথমে আমরা একটি সেবা (service) ক্লাস তৈরি করি যা ডাটা রিটার্ন করবে। এখানে, আমরা একটি ApiService ক্লাস তৈরি করেছি।

ApiService.cs (Service Class)

public class ApiService
{
    public string GetData()
    {
        return "Hello from ApiService!";
    }
}

MainPageViewModel.cs (ViewModel Class)

public class MainPageViewModel : BindableObject
{
    private readonly ApiService _apiService;
    private string _message;

    public string Message
    {
        get => _message;
        set
        {
            _message = value;
            OnPropertyChanged();
        }
    }

    // Dependency Injection via constructor
    public MainPageViewModel(ApiService apiService)
    {
        _apiService = apiService;
        LoadData();
    }

    private void LoadData()
    {
        Message = _apiService.GetData();
    }
}

এখানে MainPageViewModel কন্সট্রাক্টরে ApiService ইনজেক্ট করা হয়েছে, যা ডিপেন্ডেন্সি ইনজেকশনের মাধ্যমে সরবরাহ করা হবে।


Step 2: Define the ViewModelLocator

এখন আমরা একটি ViewModelLocator ক্লাস তৈরি করবো যা আমাদের ViewModel-এ ডিপেন্ডেন্সি ইনজেক্ট করবে।

ViewModelLocator.cs (Locator Class)

public class ViewModelLocator
{
    public MainPageViewModel MainPageViewModel { get; }

    public ViewModelLocator()
    {
        // Dependency Injection
        var apiService = new ApiService();
        MainPageViewModel = new MainPageViewModel(apiService);
    }
}

এখানে ViewModelLocator ক্লাসের কন্সট্রাক্টর থেকে আমরা ApiService তৈরি করেছি এবং তা MainPageViewModel এ ইনজেক্ট করেছি। এর মাধ্যমে MainPageViewModel-এর ডিপেন্ডেন্সি ইনজেক্ট হয়েছে এবং আমরা এটি ViewModelLocator থেকে এক্সেস করতে পারব।


Step 3: Bind ViewModelLocator to the Application

এখন আমরা App.xaml.cs ফাইলে ViewModelLocator কে রেজিস্টার করব এবং আমাদের MainPage-এ সেট করে দেব।

App.xaml.cs (App Configuration)

public partial class App : Application
{
    public static ViewModelLocator ViewModelLocator { get; } = new ViewModelLocator();

    public App()
    {
        InitializeComponent();
        
        // Setting the BindingContext of MainPage to ViewModel
        MainPage = new MainPage
        {
            BindingContext = ViewModelLocator.MainPageViewModel
        };
    }
}

এখানে আমরা ViewModelLocator কে App.xaml.cs ফাইলে স্ট্যাটিকভাবে রেজিস্টার করেছি এবং MainPage-এর BindingContext হিসাবে সেট করেছি।


Step 4: Bind ViewModel to the View (MainPage.xaml)

এখন আমরা MainPage.xaml-এ ViewModel কে বাইন্ড করবো এবং UI-তে ডাটা প্রদর্শন করবো।

MainPage.xaml (View)

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Class="MAUIApp.MainPage">
    
    <StackLayout Padding="10">
        <Label Text="{Binding Message}" 
               VerticalOptions="CenterAndExpand" 
               HorizontalOptions="CenterAndExpand" />
    </StackLayout>
</ContentPage>

এখানে, আমরা Message প্রপার্টি কে MainPageViewModel এর BindingContext হিসেবে সেট করেছি এবং Data Binding এর মাধ্যমে সেটি UI তে দেখাচ্ছি।


Step 5: Run the Application

এখন, আপনার অ্যাপটি রান করলে, MainPage-এ Message প্রপার্টি থেকে ডাটা দেখাবে, যা ApiService থেকে এসেছে। এতে দেখা যাবে, "Hello from ApiService!" এই টেক্সট।


সারাংশ:

  • ViewModelLocator ব্যবহার করে আপনি আপনার MVVM আর্কিটেকচারে Dependency Injection পরিচালনা করতে পারেন।
  • ViewModelLocator এক্সপ্লিসিটভাবে ViewModel গুলোর ডিপেন্ডেন্সি ইনজেক্ট করার জন্য একটি কেন্দ্রীকৃত পদ্ধতি প্রদান করে।
  • এতে Testability এবং Code Cleanliness বজায় থাকে, কারণ আপনি সহজেই আপনার ডিপেন্ডেন্সি গুলো এক জায়গায় ম্যানেজ করতে পারেন।

এটি .NET MAUI অ্যাপ্লিকেশনে DI ব্যবহারের একটি কার্যকর কৌশল।

Content added By
Promotion